package com.trueque.uniandes.client;

import java.util.ArrayList;

import com.trueque.uniandes.shared.DatosProductos;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class TruequeUniandes implements EntryPoint {
	/**
	 * Create a remote service proxy to talk to the server-side Greeting
	 * service.
	 */
	private final GreetingServiceAsync greetingService = GWT
			.create(GreetingService.class);

	private VerticalPanel mainPanel;
	private VerticalPanel userMenu;
	private VerticalPanel options;
	private String userEmail;
	private String idTemp;
	private String idDemandadoTemp;

	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {
		mainPanel = new VerticalPanel();
		cargarLogin();
		RootPanel.get("contenido").add(mainPanel);
	}

	private void cargarLogin() {
		HorizontalPanel temp = new HorizontalPanel();
		temp.setSpacing(20);
		temp.add(new Label("Ingrse sus datos para ingresar al sistema: "));
		temp.add(new Label("Username"));
		final TextBox username = new TextBox();
		temp.add(username);
		temp.add(new Label("Password"));
		final PasswordTextBox password = new PasswordTextBox();
		temp.add(password);
		Button submit = new Button("Login");
		submit.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				autenticarUsuario(username.getText(),
						password.getText());
			}
		});
		temp.add(submit);
		temp.setWidth("700px");
		VerticalPanel temp_ver= new VerticalPanel();
		temp_ver.setWidth("700px");
		temp_ver.add(new Label("Requerimietos Taller 4"));
		temp_ver.add(new Label("Seleccione un perfil:"));
		final ListBox lb = new ListBox();
	    lb.addItem("GOLD","1");
	    lb.addItem("PREMIUM","2");
	    lb.addItem("SILVER","3");
	    lb.addItem("COPPER","4");
	    lb.addItem("SAND","5");
	    lb.addItem("NEW","6");
	    lb.addItem("NAIF","7");
	    temp_ver.add(new Label("Click alguna de las siguientes opciones:"));
		Button RF24 = new Button("Obtener el nickname y pais de residencia");
		Button RF25 = new Button("Contar el numero de clientes de un perfil seleccionada por el usuario");
		Button RF26 = new Button("Contar el numero de clientes de todos los perfiles");
		temp_ver.add(lb);
		temp_ver.add(RF24);
		temp_ver.add(RF25);
		temp_ver.add(RF26);
		RF24.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				cargarRF24(lb.getValue(lb.getSelectedIndex()));
				
			}
		});
		RF25.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				cargarRF25(lb.getValue(lb.getSelectedIndex()));
				
			}
		});
		RF26.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				cargarRF26();
				
			}
		});
		mainPanel.add(temp);
		mainPanel.add(temp_ver);
	}

	private void cargarRF24(String value) {
		greetingService.cargarRF24(value,new AsyncCallback<ArrayList<String>>() {

			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void onSuccess(ArrayList<String> result) {
				for (int i = 0; i < result.size(); i++) {
					mainPanel.add(new Label("Nickname/Pais residencia: "+result.get(i)));
				}
				
			}

		});
		
	}
	private void cargarRF25(String value) {
		greetingService.cargarRF25(value,new AsyncCallback<String>() {

			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void onSuccess(String result) {
				mainPanel.add(new Label("El numero de clientes del perfil seleccionado es: "+result));
				
			}

			
		});
		
	}
	private void cargarRF26() {
		greetingService.cargarRF26(new AsyncCallback<String>() {

			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void onSuccess(String result) {
				mainPanel.add(new Label("El numero de clientes de todos los perfiles es: "+result));
				
			}
		});
		
	}
	
	private void autenticarUsuario(String username, String password) {
		greetingService.autenticarUsuario(username, password,
				new AsyncCallback<String>() {
					@Override
					public void onFailure(Throwable caught) {
						mainPanel
								.add(new Label(
										"La informacion proporcionada es incorrecta! porfavor intente nuevamente"));
					}
					@Override
					public void onSuccess(String result) {
						userEmail= result;
						RootPanel.get("log").add(
								new Label("Bienvenido: " + result));
						Cookies.setCookie("usuario", userEmail);
						cargarMenuPrincipal();
					}
				});
	}

	private void cargarMenuPrincipal() {
		mainPanel.clear();
		userMenu = new VerticalPanel();
		userMenu.setWidth("950");
		options = new VerticalPanel();
		options.setWidth("950");
		FlexTable t2 = new FlexTable();
		populateTable(t2,2,null);
		options.add(t2);
		mainPanel.add(options);
		mainPanel.add(userMenu);
	}

	private void populateTable(final FlexTable t, int i,String opcional) {
		switch (i) {
		case 2:
			t.setTitle("Mis productos (Registrados en el ultimo mes)");
			t.setText(0, 0, "Mis Productos");
			t.setText(0, 1, " ");
			t.setText(0, 2, " ");
			t.setBorderWidth(2);
			t.setWidth("900");
			greetingService.poblarTablaProductosUsuario(userEmail,new AsyncCallback<ArrayList<DatosProductos>>() {
				@Override
				public void onFailure(Throwable caught) {
					t.setText(0, 1, "No ha sido posible cargar los produstos");
				}
				@Override
				public void onSuccess(ArrayList<DatosProductos> result) {
					for (int j = 0; j < result.size(); j++) {
						final String id=result.get(j).getId();
						final String idDemandado=result.get(j).getIdDemandado();
						final String emailDemandante=result.get(j).getDemandante();
						final int pos=j+1;
						Button aceptar = new Button("Acertar Oferta");
						aceptar.addClickHandler(new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								aceptarOferta(idDemandado,true);
							}
						});
						Button rechazar = new Button("Rechazar Oferta");
						rechazar.addClickHandler(new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								//ID_DEMANDADO ES EL ID DE LA OFERTA
								aceptarOferta(idDemandado,false);
							}
						});
						Button contraoferta = new Button("ContraOferta");
						contraoferta.addClickHandler(new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								//El id de mi producto y el elail para ver los productos del otro
								contraOfertar(id,emailDemandante,idDemandado);
							}
						});
						Button invalidar = new Button("Invalidar Cliente");
						invalidar.addClickHandler(new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								invalidarOfertasSegunCliente(emailDemandante);
							}
						});
						Button actualizarPrecio = new Button("Actualizar Precio");
						actualizarPrecio.addClickHandler(new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								actualizarPrecioMain(id,pos);
							}					
						});
						t.setText(j+1, 0, result.get(j).getId());
						t.setText(j+1, 1, result.get(j).getNombre());
						t.setText(j+1, 2, result.get(j).getValor());
						t.setText(j+1, 3, result.get(j).getIdDemandado());
						t.setText(j+1, 4, result.get(j).getNombreDemandado());
						t.setText(j+1, 5, result.get(j).getValorDemandado());
						t.setText(j+1, 6, result.get(j).getDemandante());
						t.setWidget(j+1, 7, aceptar);
						t.setWidget(j+1, 8, rechazar);
						t.setWidget(j+1, 9, contraoferta);
						t.setWidget(j+1, 10, invalidar);
						t.setWidget(j+1, 11, actualizarPrecio);
					}
				}
			});
			break;
		case 3:
			t.setTitle("Listado de productos de usuario");
			t.setText(0, 0, "Los productos del usuario son ");
			t.setText(0, 1, " ");
			t.setText(0, 2, " ");
			t.setBorderWidth(2);
			t.setWidth("900");
			greetingService.poblarTablaProductos(opcional,new AsyncCallback<ArrayList<DatosProductos>>() {
				@Override
				public void onFailure(Throwable caught) {
					t.setText(0, 1, "No ha sido posible cargar los produstos");
				}
				@Override
				public void onSuccess(ArrayList<DatosProductos> result) {
					for (int j = 0; j < result.size(); j++) {
						final String idProducto=result.get(j).getId(); 
						Button seleccionar = new Button("Seleccionar");
						seleccionar.addClickHandler(new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								realizarContraOferta(idProducto);
							}					
						});
						t.setText(j+1, 0, result.get(j).getId());
						t.setText(j+1, 1, result.get(j).getNombre());
						t.setText(j+1, 2, result.get(j).getValor());
					}
				}
			});
			break;
		default:
			break;
		}
	}
	private void contraOfertar(String id,
			String emailDemandante,String idDemandado) {
		idTemp=id;
		idDemandadoTemp=idDemandado;
		FlexTable t3 = new FlexTable();
		populateTable(t3,3,emailDemandante);
		options.add(t3);
	}
	private void invalidarOfertasSegunCliente(
			String emailDemandante) {
		greetingService.invalidarOfertasSegunCliente(emailDemandante,new AsyncCallback<String>() {
			@Override
			public void onFailure(Throwable caught) {
				userMenu.add( new Label(caught.getMessage()));
			}
			@Override
			public void onSuccess(String result) {
				userMenu.add( new Label(result));
				
			}
		});
		
	}
	private void aceptarOferta(String idDemandado,boolean b) {
		greetingService.actualizarOferta(idDemandado,b,new AsyncCallback<String>() {

			@Override
			public void onFailure(Throwable caught) {
				userMenu.add( new Label(caught.getMessage()));
				
			}

			@Override
			public void onSuccess(String result) {
				userMenu.add( new Label(result));
				
			}
		});
		
	}
	private void actualizarPrecioMain(String id,int posicion) {
		final String nid=id;
		Label label2= new Label("Ingrese el nuevo precio para el producto de id:"+id);
		final TextBox textBoxP = new TextBox();
		Button submitPrecio= new Button("Cambiar Precio");
		submitPrecio.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				actualizarPrecio(nid,Integer.parseInt(textBoxP.getText()));
				
			}
		});
		//((HTMLTable) options.getWidget(1)).setText(posicion, 2, textBoxP.getText());
		userMenu.add(label2);
		userMenu.add(textBoxP);
		userMenu.add(submitPrecio);
	}
	private void actualizarPrecio(String id,int nPrecio) {
		greetingService.actualizarPrecio(id,nPrecio,new AsyncCallback<String>(){

			@Override
			public void onFailure(Throwable caught) {
				userMenu.add( new Label(caught.getMessage()));
				
			}

			@Override
			public void onSuccess(String result) {
				userMenu.add( new Label(result));
				
			}
		});
		
	}
	private void realizarContraOferta(String idProducto) {
		greetingService.generarContraOferta(idTemp,idProducto,idDemandadoTemp,new AsyncCallback<String>() {
			@Override
			public void onFailure(Throwable caught) {
				userMenu.add( new Label(caught.getMessage()));
			}
			@Override
			public void onSuccess(String result) {
				userMenu.add( new Label(result));
				
			}
		});
		
	}
}
